package com.example.demo.abs;

import com.example.demo.exception.PayException;
import com.example.demo.vo.PayVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 支付抽象类
 */
public abstract class AbstractPay {

    private static final Logger LOG = LoggerFactory.getLogger(AbstractPay.class);
    

    /**
     * 执行具体业务逻辑
     * @param payVO
     * @return void
     */
    protected abstract void doBusiness(PayVO payVO);

    /**
     * 提供默认的支付处理流程实现
     * @param payVO
	 * @return void
     */
    protected void doPay(PayVO payVO) {
    	//step1 支付前校验相关逻辑，比如：校验订单金额是否与支付金额一致、申请支付单号等
    	LOG.info("step1 支付前校验相关逻辑，比如：校验订单金额是否与支付金额一致等等");
    	payBefore(payVO);
    	try {
    		//step2 执行具体支付业务逻辑
    		LOG.info("step2 执行具体支付业务逻辑,当前参数={}", payVO.toString());
        	doBusiness(payVO);
        	
        	//step3 支付成功后的后续逻辑，比如：订单状态改为已支付、记录日志等
        	LOG.info("step3 支付成功后的后续逻辑，比如：改变订单状态、记录日志等");
        	paySuccess(payVO);
        } catch (Exception e) {
        	//step3 支付失败逻辑，比如：订单状态改为失败并记录好失败原因、记录日志等
        	LOG.info("step3 更新同步记录表的状态为失败，注意：此处不更新请求时间");
        	payError(payVO);
        	throw new PayException("支付异常", e);
        }
    }

    /**
     * 支付预处理
	 * @param payVO
	 */
	private void payBefore(PayVO payVO){
		// do pay before business
		LOG.info(payVO.toString());
	}

    /**
     * 支付成功
     * @param payVO
     * @return void
     */
    private void paySuccess(PayVO payVO) {
    	// do pay success business
    	LOG.info(payVO.toString());
    }
    
    /**
     * 支付失败
     * @param payVO
     * @return void
     */
    private void payError(PayVO payVO) {
		// do pay error business
		LOG.info(payVO.toString());
    }
}
